import json
from typing import Iterable

from requests.cookies import RequestsCookieJar
from requests.structures import CaseInsensitiveDict

from handlers.handler_log import logger
from datetime import timedelta


def get_nodes_data(data: list | tuple | set | dict, *nodes) -> list | tuple | set | dict:
    """
    获取节点中的数据
    :param data: 需要被提取的数据
    :param nodes: 数据的节点
    :return: 提取的数据
    """
    try:
        for node in nodes:
            if isinstance(data, dict) and isinstance(node, str) and node in data:
                # 当data为字典时，获取指定key的value值
                data = data.get(node)
            elif isinstance(data, list | tuple) and isinstance(node, int) and node < len(data):
                # 当data为 列表 或 元组 时，获取指定索引的值
                data = data[node]
            elif isinstance(data, set):
                # 当data为集合时，就随机获取一个值
                data = data.pop()
            else:
                raise TypeError(f"节点类型异常 或 节点不存在, 节点类型为：{type(node)}，节点：{node}，寻找的内容：{data}")
        return data
    except Exception as e:
        logger.exception(f'获取节点中的数据异常：{e}')


def object_to_str(data) -> str:
    """
   对象 转换为 格式化的字符串。
    :param data: 字典 或 字符串(可以转换为字典的字符串)
    :return: 格式化的字符串
    """
    try:
        # 处理CaseInsensitiveDict特殊类型数据 转换为str类型
        if isinstance(data, CaseInsensitiveDict):
            result = str(data).replace("'", '"')
            result = str_to_dict(result)
            result = object_to_str(result)
            return result

        result = json.dumps(data, ensure_ascii=False, indent=4)
        return result
    except Exception as e:
        logger.exception(f'对象 转换为 格式化的字符串异常：{e}')


def str_to_dict(data: str) -> dict:
    """
    字符串转换为字典类型数据
    :param data: 字符串
    :return:  字典
    """
    try:
        result = json.loads(data)
        return result
    except Exception as e:
        logger.error(f'字字符串转换为字典类型数据异常：{e}')


def is_none_dict(data) -> bool:
    """
    判断是否为空 和 是否为字典类型
    :param data: 需要判断的数据
    :return: False 该数据为空或不是字典类型， True 该数据不为空且是字典数据类型且长度大于0
    """
    try:
        if isinstance(data, dict) and data is not None and len(data) > 0:
            return True
        else:
            return False
    except Exception as e:
        logger.error(f'判断是否为空 和 是否为字典类型异常：{e}')


def get_file_binary(file_path: str) -> bin:
    """
    获取文件对象
    :param file_path: 文件路径
    :return: 文件对象
    """
    try:
        file = open(file_path, 'rb')
        return file
    except Exception as e:
        logger.error(e)


def format_duration(seconds: float) -> str:
    """
    将秒数转换为 时 分 秒
    :param seconds:
    :return:
    """
    return str(timedelta(seconds=seconds)).split('.')[0]


def dict_to_format_string(data: dict) -> str:
    """
    字典变成特定格式化的str类型
    example： {"a":"b", "c":"d"}   ->    a=b&c=d
    :param data: 字典数据
    :return: 格式化的字符串
    """
    result = str()
    for key, value in data.items():
        result = "&" + f"{key}={value}" + result
    result = result.replace('&', '', 1)
    return result

